<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style></style>
  </head>
  <body>
    <div>promise类的核心逻辑实现</div>
    <p>
      1.promise就是一个类 在执行这个类的时候 需要传递一个执行器进去
      执行器回立即执行(也就是resolve和reject其中之一)
    </p>
    <p>
      2.Promise中有三种状态 分别为 成功fulfilled 失败rejected 等待pending
      [调用reject===pending -->rejected ][调用resolve===pending -->fulfilled]
      一旦状态确定就不可更改
    </p>
    <p>
      3.resolve和reject函数是用来更改状态的 resolve:fulfilled reject:rejected
    </p>
    <p>
      4.then方法内部做的事情就是判断状态 如果状态是成功 调用成功回调函数
      如果状态是失败 调用失败回调函数 then方法是被定义在原型对象中的
    </p>
    <p>
      5.then成功回调有一个参数 表示成功之后的值 then失败回调有一个参数
      表示失败的原因
    </p>
    <p>
      6.then方法是可以被链式调用的,后面then方法的回调函数拿到值的是上一个then方法的回调函数的返回值
    </p>
    <p>7.链式调用中的then方法是不允许返回当前then方法的promise对象的</p>
    <p>
      8.then的链式调用如果前面的then都没有回调函数，promise的状态会依次向后传递，找到第一个带回调函数的then方法，promise的状态也可以一直向后传递，每次then方法return该状态即可
    </p>
    <p>
      9.promise.all方法是用来解决异步并发问题的，他允许我按照异步代码的调用顺序，得到按顺序的结果。promise.all方法接收一个数组，数组里面可以存放任何值,promise.all返回的也是一个promise对象,因此后面可以用then,并且promise是一个静态方法
    </p>
    <p>
      10.finally方法。1.无论promise方法是否成功还是失败,finally方法中的回调函数始终会被回调一次
      2.finally后面可以链式调用then方法
    </p>
    <script>
      //   上面的第七点;
      var p1 = new Promise((resolve, reject) => {
        resolve(100);
      });

      var p2 = p1
        .then((res) => {
          console.log("12", res);
          //这里的return是不能返回当前promise对象的,因为这样回引起循环调用
          return p2;
        })
        .then((res) => console.log(res));
      //   此时then不起作用, 因为上一级then返回了当前then方法的promise对象;
    </script>

    <script>
      function p1() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve("p1");
          }, 2000);
        });
      }
      function p2() {
        return new Promise((resolve, reject) => {
          resolve("p2");
        });
      }
      Promise.all(["a", "b", "p1()", "p2()", "c"]).then(
        (res) => console.log(res) // ['a','b','p1','p2','c']
      );
    </script>
    <script>
      let promise = new Promise((resolve, reject) => {
        resolve("成功");
        reject("失败");
      });

      promise
        .then
        //   (res) => {
        //     console.log(res);
        //     return 10;
        //   },
        //   (err) => {
        //     console.log(err);
        //   }
        ()
        .then((value) => {
          // 这里的value取决于上一个then方法的返回值
          console.log("q", value); //10  输出上一个then方法的返回值
        });
    </script>
  </body>
</html>
